-- 定义参数
local function print_title(title)
print("+------------------------------")
print("| "..title)
print("+------------------------------")
end

print_title("Hello World")

-- TIPS：在LUA，函数也是一种数据类型。所以使用函数与使用值是一样的。同样也可以做为参数传递。

-- Higher-order Functions（高阶函数），特征有二（至少有其中之一）：
-- 1、接受一个或多个函数做为参数
-- 2、返回函数做为结果
local players = {
    {name="Ada", score=400},
    {name="2B", score=200},
    {name="Lucy", score=300},
    {name="Athena", score=1000},
    {name="Artimes", score=500},
}
-- 进行排序的函数，就接受一个比较函数做为参数。
table.sort(players, function(a,b) return a.score > b.score end)
for index, value in ipairs(players) do
    print(value.name.." "..value.score)
end

-- Closures（闭包）
-- 闭包的功能就是这个内部的函数，能够访问其所在作用域的变量
-- 可以做为返回项目
math.randomseed(os.time())
local function discover(multi_rate)
    local fixed_point = 100
    local function gained_random_point(point)
        return math.random(1, point) * multi_rate + fixed_point
    end
    return gained_random_point
end
-- 这里就定义了两种函数，一个是1倍，一个是5倍。这就是闭包的一种应用方式
local small_discover = discover(1.0)
local large_discover = discover(5.0)
print(small_discover(100))
print(large_discover(100))


-- Variadic Function（可变参数函数）

-- 直接使用
local function add_all(...)
    local a,b,c = ...
    return a + b + c
end
print("Add All:"..add_all(10,20,30))

-- 转为列表
local function find_max(...)
    local n = 0
    -- 这行能够把函数变为一个列表
    local args = {...}
    local max = args[1]
    for i, num in ipairs(args) do
        if num > max then
            max = num
        end
        n = n + 1
    end
    return n, max    
end
local n, max = find_max(11,23,54365,132,14,51,5,7777)
print("The max value in "..n.." numbers is: "..max)